#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"

unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;
//按键键码  模式  时间设置选择位  时间设置闪烁标志位

void TimeShow(void)  //时钟显示
{
	DS1302_ReadTime();
	LCD_ShowNum(1,1,DS1302_Time[0],2);  
	LCD_ShowNum(1,4,DS1302_Time[1],2); 
	LCD_ShowNum(1,7,DS1302_Time[2],2);  
	LCD_ShowNum(2,1,DS1302_Time[3],2);  
	LCD_ShowNum(2,4,DS1302_Time[4],2);  
	LCD_ShowNum(2,7,DS1302_Time[5],2);  

}

void TimeSet(void)  //时钟设置（*）  很关键
{
	if (KeyNum==2)
	{
		TimeSetSelect++;
		if (TimeSetSelect>5){TimeSetSelect=0;}  //越界清零，当大于6时就重新回到0
	}
	if (KeyNum==3)
	{
		DS1302_Time[TimeSetSelect]++;
		if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判断  大于99后置1
		if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判断  大于12后置1
		if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
			DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断  （分月份进行讨论）
		{
			if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月  大于31后置1
		}
		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
		{
			if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月  大于30后置1
		}
		else if(DS1302_Time[1]==2)  //2月单独讨论
		{
			if(DS1302_Time[0]%4==0)  //判断是不是闰年
			{
				if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月  大于29后置1
			}
			else
			{
				if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月  大于28后置1
			}
		}
		if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断  大于23后置1
		if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断  大于59后置1
		if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断  大于59后置1

	}
	if (KeyNum==4)
	{
		DS1302_Time[TimeSetSelect]--;
		//以下判断逻辑与上面相同
		if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断
		if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断
		if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
			DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
		{
			if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
			if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
		}
		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
		{
			if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
			if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
		}
		else if(DS1302_Time[1]==2)
		{
			if(DS1302_Time[0]%4==0)
			{
				if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
				if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
			}
			else
			{
				if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
				if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
			}
		}
		if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
		if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
		if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
	}
	//更新显示，根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
	if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
	else {LCD_ShowNum(1,1,DS1302_Time[0],2);}
	if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
	else {LCD_ShowNum(1,4,DS1302_Time[1],2);}
	if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
	else {LCD_ShowNum(1,7,DS1302_Time[2],2);}
	if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
	else {LCD_ShowNum(2,1,DS1302_Time[3],2);}
	if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
	else {LCD_ShowNum(2,4,DS1302_Time[4],2);}
	if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
	else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
}

void main()
{
	LCD_Init();
	DS1302_Init();
	Timer0Init();
	LCD_ShowString(1,1,"  -  -  ");
	LCD_ShowString(2,1,"  :  :  ");

	
	DS1302_WriteByte(0x8E,0x00);  //芯片处于保护状态，输入即解除保护状态
		
	DS1302_SetTime();
	
	while(1)
	{
		KeyNum=Key();
		if (KeyNum==1)
		{
			if (MODE==0){MODE=1;TimeSetSelect=0;}  //重新按下按键1时，会恢复到年这一位的选择
			else if (MODE==1){MODE=0;DS1302_SetTime();}
//实现按下按键是，MODE的模式就会改变这一操作
		}
		switch(MODE)
		{
			case 0:TimeShow();break;
			case 1:TimeSet();break;
		}
	}
}

void Timer0_Routine() interrupt 1 //中断函数
{
	static unsigned int T0count; //静态函数变量，子函数程序结束后不清零
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值	
	T0count++;
	if(T0count>=500) //一毫秒循环五百次即为0.5秒
	{
		T0count=0; //先清零
		TimeSetFlashFlag=!TimeSetFlashFlag;
	}
}
